package fr.esisar.p2014.cs420.nsmwnr;

import java.util.ArrayList;
import java.util.List;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.widgets.ProgressBar;

public class Commande{

	private float prixTotal = 0;
	private int noCommande = 0;
	private String adresse = "";
	private String date = "";
	private List<String[]> itemsCommande = new ArrayList<String[]>();

	protected Shell shell = null;
	protected Display display = null;
	private Text textNom;
	private Text textPrenom;
	private Text textDate;
	private Text textAdresse;
	private Table table;
	private Text textPrixTotal;
	
	protected ProgressBar progressBar;
	protected Label lblLoading;
	protected boolean fini = false;
	
	/**
	 * Crée un affichage du résumé de commande en fonction de la commande en cours
	 * @param noCommande
	 * @param itemsCommande
	 * @param adresse
	 * @param date
	 * @param prixTotal
	 * @param display
	 */
	public Commande(int noCommande, List<String[]> itemsCommande, String adresse, String date, float prixTotal){
		this.display = MainApp.display;
		this.noCommande = noCommande;
		this.adresse = adresse;
		this.prixTotal = prixTotal;
		this.itemsCommande = itemsCommande;
		this.date = date;
	}
	
	/**
	 * Défini la fenêtre comme active, l'ouvre si elle ne l'est pas
	 */
	public void setActive(){
		if(shell == null){
			run();
		}else{
			rafraichir();
			shell.setActive();
		}
	}

	/**
	 * Renseigne sur le fait que la fenêtre est déjà ouverte ou non
	 * @return true si la fenêtre n'est pas déchargée de la mémoire
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
	
	/**
	 * Point de chargement de l'interface
	 */
	/**
	 * @wbp.parser.entryPoint
	 */
	public void run() {
		shell = new Shell(display, SWT.APPLICATION_MODAL | (SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX));
		shell.setSize(708, 418);
		shell.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent arg0) {
				MainApp.commander.setActive();
			}
		});
		shell.setImage(MainApp.icone);
		shell.setLocation(display.getBounds().width / 2 - shell.getBounds().width / 2, display.getBounds().height / 2 - shell.getBounds().height / 2);
		
		textNom = new Text(shell, SWT.BORDER);
		textNom.setEditable(false);
		textNom.setBounds(126, 10, 193, 21);
		
		Label lblNom = new Label(shell, SWT.NONE);
		lblNom.setBounds(10, 13, 33, 15);
		lblNom.setText("Nom :");
		
		textPrenom = new Text(shell, SWT.BORDER);
		textPrenom.setEditable(false);
		textPrenom.setBounds(126, 37, 193, 21);
		
		Label lblPrnom = new Label(shell, SWT.NONE);
		lblPrnom.setBounds(10, 40, 55, 15);
		lblPrnom.setText("Pr\u00E9nom :");
		
		textDate = new Text(shell, SWT.BORDER);
		textDate.setEditable(false);
		textDate.setBounds(126, 64, 193, 21);
		
		Label lblDate = new Label(shell, SWT.NONE);
		lblDate.setBounds(10, 67, 55, 15);
		lblDate.setText("Date :");
		
		textAdresse = new Text(shell, SWT.BORDER);
		textAdresse.setEditable(false);
		textAdresse.setBounds(126, 91, 566, 21);
		
		Label lblAdresseDeLivraison = new Label(shell, SWT.NONE);
		lblAdresseDeLivraison.setBounds(10, 94, 110, 15);
		lblAdresseDeLivraison.setText("Adresse de livraison :");
		
		table = new Table(shell, SWT.BORDER | SWT.FULL_SELECTION);
		table.setBounds(10, 118, 682, 233);
		table.setHeaderVisible(true);
		table.setLinesVisible(true);
		
		TableColumn tblclmnTitre = new TableColumn(table, SWT.NONE);
		tblclmnTitre.setWidth(210);
		tblclmnTitre.setText("Titre");
		
		TableColumn tblclmnAuteur = new TableColumn(table, SWT.NONE);
		tblclmnAuteur.setWidth(110);
		tblclmnAuteur.setText("Auteur");
		
		TableColumn tblclmnFormat = new TableColumn(table, SWT.NONE);
		tblclmnFormat.setWidth(139);
		tblclmnFormat.setText("Format");
		
		TableColumn tblclmnQuantit = new TableColumn(table, SWT.NONE);
		tblclmnQuantit.setWidth(100);
		tblclmnQuantit.setText("Quantit\u00E9");
		
		TableColumn tblclmnPrixUnitaire = new TableColumn(table, SWT.NONE);
		tblclmnPrixUnitaire.setWidth(100);
		tblclmnPrixUnitaire.setText("Prix unitaire");
		
		textPrixTotal = new Text(shell, SWT.BORDER);
		textPrixTotal.setEditable(false);
		textPrixTotal.setBounds(582, 357, 110, 21);
		
		Label lblPrixTotal = new Label(shell, SWT.NONE);
		lblPrixTotal.setBounds(521, 360, 55, 15);
		lblPrixTotal.setText("Prix total :");
		
		lblLoading = new Label(shell, SWT.NONE);
		lblLoading.setForeground(SWTResourceManager.getColor(SWT.COLOR_RED));
		lblLoading.setBounds(116, 360, 389, 15);
		lblLoading.setText("La commande est en cours de traitement...");
		
		progressBar = new ProgressBar(shell, SWT.SMOOTH);
		progressBar.setForeground(SWTResourceManager.getColor(30, 144, 255));
		progressBar.setBounds(10, 359, 100, 17);
		
		rafraichir();
		shell.open();
	}
	
	/**
	 * Mise à jour des éléments en fonction de l'état
	 */
	public void rafraichir(){
		shell.setText("Résumé de la commande n°" + noCommande);
		textNom.setText(MainApp.nom);
		textPrenom.setText(MainApp.prenom);
		textDate.setText(date);
		textAdresse.setText(adresse);
		textPrixTotal.setText(String.valueOf(prixTotal) + " \u20AC");
		
		table.removeAll();
		for(int i = 0; i < itemsCommande.size() ; i++){
			TableItem tableItem = new TableItem(table, SWT.NONE);
			tableItem.setText(itemsCommande.get(i));
		}
	}
	
	/**
	 * Animation de la barre de chargement
	 */
	public void go() {
		progressBar.setSelection(100);
	}
	
	/**
	 * Arrête l'animation dans le cas où tout s'est bien passé
	 */
	public void stop() {
		fini = true;
		lblLoading.setText("Votre commande a correctement été envoyée, merci.");
		lblLoading.setForeground(SWTResourceManager.getColor(SWT.COLOR_BLUE));
	}
	
	/**
	 * Stopppe l'annimation dans le cas où il y a eu une erreur
	 */
	public void erreur() {
		fini = true;
		lblLoading.setText("Une erreur est survenue lors de l'envoi du mail.");
		lblLoading.setForeground(SWTResourceManager.getColor(SWT.COLOR_DARK_RED));
	}
}
